package com.hsu.yuapiclientsdk.client;

import cn.hutool.core.util.RandomUtil;
import cn.hutool.http.HttpRequest;
import cn.hutool.http.HttpResponse;
import cn.hutool.http.HttpUtil;
import cn.hutool.json.JSONUtil;
import com.hsu.yuapiclientsdk.model.User;
import com.hsu.yuapiclientsdk.utils.SignUtils;

import java.util.HashMap;
import java.util.Map;

/**
 * 调用第三方接口
 * @ClassName: YuapiClient
 * @author Hsu琛君珩
 * @date 2024-08-15
 * @apiNote
 * @Version: v1.0
 */
public class YuApiClient {

    private String accessKey;
    private String secretKey;

    private static final String GATEWAY_HOST = "http://localhost:8090";

    public YuApiClient(String accessKey, String secretKey) {
        this.accessKey = accessKey;
        this.secretKey = secretKey;
    }

    // 使用 GET 方法从服务器获取名称信息
    public String getNameByGet(String name) {
        // 可以单独传入 http 参数，这样传参会自动做URL编码，拼接在URL中
        Map<String, Object> paramMap = new HashMap<>();
        paramMap.put("name", name);
        // 使用HttpUtil工具发起GET请求，并获取服务器返回的结果
        String result = HttpUtil.get(GATEWAY_HOST + "/api/name/", paramMap);
        System.out.println(result);
        return result;
    }

    // 使用 POST 方法从服务器获取名称信息
    public String getNameByPost(String name) {
        // 可以单独传入 http 参数，这样传参会自动做URL编码，拼接在URL中
        Map<String, Object> paramMap = new HashMap<>();
        paramMap.put("name", name);
        // 使用HttpUtil工具发起POST请求，并获取服务器返回的结果
        String result = HttpUtil.post(GATEWAY_HOST + "/api/name/", paramMap);
        System.out.println(result);
        return result;
    }

    // 构造请求头
    private Map<String, String> getHeaderMap(String body) {
        Map<String, String> hashMap = new HashMap<>();
        // 将 accessKey 和对应的值放入 map 中
        hashMap.put("accessKey", accessKey);
        // 将 secretKey 和对应的值放入 map 中，但我们这里注释掉，因为不能直接发送密钥
//        hashMap.put("secretKey", secretKey);
        // 生成一个4位的随机数字的字符串
        hashMap.put("nonce", RandomUtil.randomNumbers(4));
        // 请求体内容
        hashMap.put("body", body);
        // 当前时间戳，将毫秒/1000转化为秒，再转为字符串
        hashMap.put("timestamp", String.valueOf(System.currentTimeMillis() / 1000));
        // 签名
        hashMap.put("sign", SignUtils.genSign(body, secretKey));
        return hashMap;
    }

    // 使用 POST 方法向服务器发送User对象，并获取服务器返回的结果
    public String getUserNameByPost(User user) {
        // 将User对象转换为JSON字符串
        String json = JSONUtil.toJsonStr(user);
        // 使用HttpRequest工具发起POST请求，并获取服务器响应
        HttpResponse httpResponse = HttpRequest.post(GATEWAY_HOST + "/api/name/user")
                .addHeaders(getHeaderMap(json))// 添加前面构造的请求头
                .body(json)// 将JSON字符串设置为请求体
                .execute();// 执行请求
        // 打印状态码
        System.out.println(httpResponse.getStatus());
        String result = httpResponse.body();
        System.out.println(result);
        return result;
    }
}
